﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using Model;

namespace Model
{
    public class Opkobling
    {
        private int port;
        private string localIP;
        bool serverAktiv = false;
        AktuelleAuktion aktuelleauktion;

        // i opkobling() sættes serverens ip til ens computers ip, og porten sættes til et selvvalgt nr.
        // aktuelleauktion sendes med for at få de lister vi har oprettet, fx auktionerne der er oprettet.
        public Opkobling(AktuelleAuktion aktuelleauktion)
        {
            localIP = GetIP();
            port = 65321;
            this.aktuelleauktion = aktuelleauktion;
        }

        // Tilslut() lytter til om der kommer en ny klient, og så længe serveren er aktiv får hver klient sin egen
        // clienthandler tråd
        public void Tilslut()
        {
            
            IPAddress ip = IPAddress.Parse(localIP);
            TcpListener listener = new TcpListener(ip, port);
            listener.Start();

            serverAktiv = true;

            while (serverAktiv)
            {
                // Forsætter først når der er en klient der opretter forbindelse.
                Socket clientSocket = listener.AcceptSocket();


                ClientHandler handler = new ClientHandler(clientSocket, aktuelleauktion);

                Thread t = new Thread(handler.RunClient);
                t.Start();
            }
        }

        // GetIP() sørger for at vi får IP'en på den nuværende maskine på netværket (LAN) så klienterne kan finde
        // vores server ud fra den IP som metoden returnere.
        private string GetIP()
        {
            string strHostName = "";
            strHostName = System.Net.Dns.GetHostName();

            IPHostEntry ipEntry = System.Net.Dns.GetHostEntry(strHostName);

            IPAddress[] addr = ipEntry.AddressList;

            // Skal have en forklaring på denne linie!!
            return addr[addr.Length - 1].ToString();

        }
        #region *** Properties ***
        public string LocalIP
        {
            get { return localIP; }
        }
        #endregion
    }
}
